vulkan: Get vertex description from pipeline subclass
authorBenjamin Otte <otte@redhat.com>
Sun, 18 Dec 2016 04:33:16 +0000 (05:33 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:11 +0000 (18:01 +0100)
gsk/gskvulkanblendpipeline.c
gsk/gskvulkancolorpipeline.c
gsk/gskvulkanpipeline.c
gsk/gskvulkanpipelineprivate.h

index eaaed67987c18ecfaeda5d46a645f8df942a9996..59dd971f16d272a39e17e8f583af30cea7ed8609 100644 (file)
@@ -19,6 +19,41 @@ struct _GskVulkanVertex
 
 G_DEFINE_TYPE (GskVulkanBlendPipeline, gsk_vulkan_blend_pipeline, GSK_TYPE_VULKAN_PIPELINE)
 
+static const VkPipelineVertexInputStateCreateInfo *
+gsk_vulkan_blend_pipeline_get_input_state_create_info (GskVulkanPipeline *self)
+{
+  static const VkVertexInputBindingDescription vertexBindingDescriptions[] = {
+      {
+          .binding = 0,
+          .stride = 4 * sizeof (float),
+          .inputRate = VK_VERTEX_INPUT_RATE_VERTEX
+      }
+  };
+  static const VkVertexInputAttributeDescription vertexInputAttributeDescription[] = {
+      {
+          .location = 0,
+          .binding = 0,
+          .format = VK_FORMAT_R32G32_SFLOAT,
+          .offset = 0,
+      },
+      {
+          .location = 1,
+          .binding = 0,
+          .format = VK_FORMAT_R32G32_SFLOAT,
+          .offset = 2 * sizeof (float),
+      }
+  };
+  static const VkPipelineVertexInputStateCreateInfo info = {
+      .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
+      .vertexBindingDescriptionCount = G_N_ELEMENTS (vertexBindingDescriptions),
+      .pVertexBindingDescriptions = vertexBindingDescriptions,
+      .vertexAttributeDescriptionCount = G_N_ELEMENTS (vertexInputAttributeDescription),
+      .pVertexAttributeDescriptions = vertexInputAttributeDescription
+  };
+
+  return &info;
+}
+
 static void
 gsk_vulkan_blend_pipeline_finalize (GObject *gobject)
 {
@@ -30,7 +65,11 @@ gsk_vulkan_blend_pipeline_finalize (GObject *gobject)
 static void
 gsk_vulkan_blend_pipeline_class_init (GskVulkanBlendPipelineClass *klass)
 {
+  GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass);
+
   G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_blend_pipeline_finalize;
+
+  pipeline_class->get_input_state_create_info = gsk_vulkan_blend_pipeline_get_input_state_create_info;
 }
 
 static void
index 42a2c394963e81161818e5e22a5f4224c841c885..b7dc8f4ccbd740e17527ed545d2396f2dbdeca67 100644 (file)
@@ -19,6 +19,41 @@ struct _GskVulkanVertex
 
 G_DEFINE_TYPE (GskVulkanColorPipeline, gsk_vulkan_color_pipeline, GSK_TYPE_VULKAN_PIPELINE)
 
+static const VkPipelineVertexInputStateCreateInfo *
+gsk_vulkan_color_pipeline_get_input_state_create_info (GskVulkanPipeline *self)
+{
+  static const VkVertexInputBindingDescription vertexBindingDescriptions[] = {
+      {
+          .binding = 0,
+          .stride = 4 * sizeof (float),
+          .inputRate = VK_VERTEX_INPUT_RATE_VERTEX
+      }
+  };
+  static const VkVertexInputAttributeDescription vertexInputAttributeDescription[] = {
+      {
+          .location = 0,
+          .binding = 0,
+          .format = VK_FORMAT_R32G32_SFLOAT,
+          .offset = 0,
+      },
+      {
+          .location = 1,
+          .binding = 0,
+          .format = VK_FORMAT_R32G32_SFLOAT,
+          .offset = 2 * sizeof (float),
+      }
+  };
+  static const VkPipelineVertexInputStateCreateInfo info = {
+      .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
+      .vertexBindingDescriptionCount = G_N_ELEMENTS (vertexBindingDescriptions),
+      .pVertexBindingDescriptions = vertexBindingDescriptions,
+      .vertexAttributeDescriptionCount = G_N_ELEMENTS (vertexInputAttributeDescription),
+      .pVertexAttributeDescriptions = vertexInputAttributeDescription
+  };
+
+  return &info;
+}
+
 static void
 gsk_vulkan_color_pipeline_finalize (GObject *gobject)
 {
@@ -30,7 +65,11 @@ gsk_vulkan_color_pipeline_finalize (GObject *gobject)
 static void
 gsk_vulkan_color_pipeline_class_init (GskVulkanColorPipelineClass *klass)
 {
+  GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass);
+
   G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_color_pipeline_finalize;
+
+  pipeline_class->get_input_state_create_info = gsk_vulkan_color_pipeline_get_input_state_create_info;
 }
 
 static void
index 11380780e4e63400aa7d8aa07fca82a807ca697d..7fff1d27608b5475a0591b4b0161ac214ce50307 100644 (file)
@@ -99,32 +99,7 @@ gsk_vulkan_pipeline_new (GType                    pipeline_type,
                                                    GST_VULKAN_SHADER_STAGE_CREATE_INFO (priv->vertex_shader),
                                                    GST_VULKAN_SHADER_STAGE_CREATE_INFO (priv->fragment_shader)
                                                },
-                                               .pVertexInputState = &(VkPipelineVertexInputStateCreateInfo) {
-                                                   .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
-                                                   .vertexBindingDescriptionCount = 1,
-                                                   .pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
-                                                       {
-                                                           .binding = 0,
-                                                           .stride = 4 * sizeof (float),
-                                                           .inputRate = VK_VERTEX_INPUT_RATE_VERTEX
-                                                       }
-                                                   },
-                                                   .vertexAttributeDescriptionCount = 2,
-                                                   .pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
-                                                       {
-                                                           .location = 0,
-                                                           .binding = 0,
-                                                           .format = VK_FORMAT_R32G32_SFLOAT,
-                                                           .offset = 0,
-                                                       },
-                                                       {
-                                                           .location = 1,
-                                                           .binding = 0,
-                                                           .format = VK_FORMAT_R32G32_SFLOAT,
-                                                           .offset = 2 * sizeof (float),
-                                                       }
-                                                   }
-                                               },
+                                               .pVertexInputState = GSK_VULKAN_PIPELINE_GET_CLASS (self)->get_input_state_create_info (self),
                                                .pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
                                                    .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
                                                    .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
index 1f1ad1a6b2242a32e74eaf585c13646824dd08d9..91ffee8f382518ede69e9acdd4f9a78c917afd57 100644 (file)
@@ -16,6 +16,9 @@ G_DECLARE_DERIVABLE_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, GSK, VULKAN_PI
 struct _GskVulkanPipelineClass
 {
   GObjectClass parent_class;
+
+  const VkPipelineVertexInputStateCreateInfo *
+                                (* get_input_state_create_info)         (GskVulkanPipeline              *self);
 };
 
 static inline VkResult